package com.quanxiaoha.xiaohashu.oss.biz.strategy.impl;


import com.aliyun.oss.OSS;
import com.quanxiaoha.xiaohashu.oss.biz.config.AliyunOSSProperties;
import com.quanxiaoha.xiaohashu.oss.biz.strategy.FileStrategy;
import jakarta.annotation.Resource;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayInputStream;
import java.util.UUID;

/**
 * @Author: jingyan_liu
 * @CreateTime: 2025-07-20
 * @Description: 阿里云 OSS 文件上传策略实现类
 * 实现了 FileStrategy 接口，用于将文件上传到阿里云 OSS 存储服务。
 * 该类依赖于 AliyunOSSProperties 和 OSS 客户端，用于配置和操作阿里云 OSS。
 * @Version: 1.0
 */


@Slf4j
public class AliyunOSSFileStrategy implements FileStrategy {
	@Resource
	private AliyunOSSProperties aliyunOSSProperties;
	
	@Resource
	private OSS ossClient;
	
	@Override
	@SneakyThrows
	public String uploadFile(MultipartFile file, String bucketName) {
		log.info("## 上传文件至阿里云 OSS ...");
		bucketName = "xiaohashu-jing";
		// 判断文件是否为空
		if (file == null || file.getSize() == 0) {
			log.error("==> 上传文件异常：文件大小为空 ...");
			throw new RuntimeException("文件大小不能为空");
		}
		
		// 文件的原始名称
		String originalFileName = file.getOriginalFilename();
		if (originalFileName == null) {
			log.error("==> 获取文件原始名失败");
			throw new NullPointerException();
		}
		// 生成存储对象的名称（将 UUID 字符串中的 - 替换成空字符串）
		String key = UUID.randomUUID().toString().replace("-", "");
		// 获取文件的后缀，如 .jpg
		String suffix = originalFileName.substring(originalFileName.lastIndexOf("."));
		
		// 拼接上文件后缀，即为要存储的文件名
		String objectName = String.format("%s%s", key, suffix);
		
		log.info("==> 开始上传文件至阿里云 OSS, ObjectName: {}", objectName);
		
		// 上传文件至阿里云 OSS
		ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(file.getInputStream().readAllBytes()));
		
		// 返回文件的访问链接
		String url = String.format("https://%s.%s/%s", bucketName, aliyunOSSProperties.getEndpoint(), objectName);
		log.info("==> 上传文件至阿里云 OSS 成功，访问路径: {}", url);
		return url;
	}
}



